From: Jonas Ã…dahl Date: Fri, 1 Dec 2017 04:18:30 +0000 (+0800) Subject: wayland: Maybe postpone xdg-foreign state setup until mapping X-Git-Tag: archive/raspbian/3.24.39-1+rpi1~1^2~65^2~38^2~132 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=dee5142c919fc197cec5a8832f12561c977cb5b5;p=gtk%2B3.0.git wayland: Maybe postpone xdg-foreign state setup until mapping In order to map a window with the correct initial parent-child relationship when a modal dialog is set up to be a child of an imported foreign window, the relationship must be set up before the window is mapped. In order to do this, if a window is not yet mapped, postpone the relationship setup until when the window is eventually mapped. https://bugzilla.gnome.org/show_bug.cgi?id=791062 --- diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index bc1a9d0bdd..0429ee5f54 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -1086,6 +1086,24 @@ gdk_wayland_window_sync_parent (GdkWindow *window, parent_toplevel); } +static void +gdk_wayland_window_sync_parent_of_imported (GdkWindow *window) +{ + GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); + + if (!impl->display_server.wl_surface) + return; + + if (!impl->imported_transient_for) + return; + + if (!impl->display_server.xdg_toplevel) + return; + + zxdg_imported_v1_set_parent_of (impl->imported_transient_for, + impl->display_server.wl_surface); +} + static void gdk_wayland_window_update_dialogs (GdkWindow *window) { @@ -1542,6 +1560,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS window); gdk_wayland_window_sync_parent (window, NULL); + gdk_wayland_window_sync_parent_of_imported (window); gdk_wayland_window_sync_title (window); if (window->state & GDK_WINDOW_STATE_MAXIMIZED) @@ -4361,12 +4380,12 @@ gdk_wayland_window_set_transient_for_exported (GdkWindow *window, g_return_val_if_fail (GDK_IS_WAYLAND_WINDOW (window), FALSE); g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE); + g_return_val_if_fail (!should_map_as_subsurface (window) && + !should_map_as_popup (window), FALSE); impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); display_wayland = GDK_WAYLAND_DISPLAY (display); - g_return_val_if_fail (impl->display_server.xdg_surface, FALSE); - if (!display_wayland->xdg_importer) { g_warning ("Server is missing xdg_foreign support"); @@ -4381,8 +4400,7 @@ gdk_wayland_window_set_transient_for_exported (GdkWindow *window, &xdg_imported_listener, window); - zxdg_imported_v1_set_parent_of (impl->imported_transient_for, - impl->display_server.wl_surface); + gdk_wayland_window_sync_parent_of_imported (window); return TRUE; }